#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<fcntl.h>

int main(){
     while(1){
         printf("[user@host path]$ ");
         fflush(stdout);//刷新标准输出文件的缓冲区
         //usleep(10000);
        char input[1024]={0};
        fgets(input,1023,stdin);//从标准输入获取一行数据
        input[strlen(input)-1]='\0';//将末尾的换行替换为结尾
         // [ ls -a -l -c ]
        char *argv[32]={NULL};
         int argc=0;
         argv[argc]=strtok(input," ");//按照空格对字符串进行分割
         while(argv[argc]!=NULL){
           argv[++argc]=strtok(NULL," ");                                                      
         }
         if(strcmp(argv[0],"cd")==0){
             chdir(argv[1]);//跳转到指定路径
             continue;
         }

         //判断是否需要重定向
         int redirect_flag=0;//0-没有 1-清空重定向 2-追加重定向
         char* redirect_file=NULL;
         for(int i=0;i<argc;i++){
             if(strcmp(argv[i],">")==0){
                 redirect_flag=1;
                 if(i+1>=argc){
                     printf("格式错误！\n");
                     continue;
                 }
                 redirect_file=argv[i+1];
                 argv[i]=NULL;
                 break;
             }
             else if(strcmp(argv[i],">>")==0){
                 redirect_flag=2;
                 if(i+1>=argc){
                     printf("格式错误！\n");
                     continue;
                 }
                 redirect_file=argv[i+1];
                 argv[i]=NULL;
                 break;
             }
         }
        pid_t child=fork();
        if(child<0){
            perror("fork error");
            continue;
        }
        else if(child==0){
            if(redirect_flag==1){
                //标准输出的清空重定向
                int fd=open(redirect_file,O_WRONLY|O_CREAT|O_TRUNC,0664);
                dup2(fd,1);//将stdout标准输出重定向到fd文件
            }
            else if(redirect_flag==2){
                //标准输出的追加重定向
                int fd=open(redirect_file,O_WRONLY|O_CREAT|O_APPEND,0664);
                dup2(fd,1);//将stdout标准输出重定向到fd文件
            }
            //让子进程运行指令程序
            execvp(argv[0],argv);//程序替换
            perror("execvp error");
            exit(-1);
        }
        wait(NULL);
        //for(int i=0;i<argc;i++){
         // printf("argv[%d]=[%s]\n",i,argv[i]);
        // }
    }
    return 0;
 }

